<?php
/**
 * Created by PhpStorm.
 * User: Happy
 * Date: 2017/2/19 0019
 * Time: 16:27
 */
//用于记录日志和分析使用者行为
class log2Plugin extends Plugin{

    private  $temp_id=false;
    private  $start_micro_time=0;
    private    $info='';

    public  function  log_start(){
    //访问日志的不记录日志
        if($_GET['act']!='log'){
            $log_name=c('meirong_name');
            $start_time=microtime(true);//记录的是毫秒
            $get=substr(json_encode($_GET),0,200);//记录200长度单位
            $post= $_POST?substr(json_encode($_POST),0,200):'';
            $add_time=date('Y-m-d H:i:s');
            $log_type=$_SERVER['SCRIPT_NAME'];//类型
            //$hash=APP_NAME;
            $remote_ip=$_SERVER["REMOTE_ADDR"];//ip地址获取
            $insert=array(
                'log_name'=>$log_name,
                'start_time'=>$start_time,
                'log_get'=>$get,
                'log_post'=>$post,
                'log_type'=>$log_type,
                'add_time'=>$add_time,
                'remote_ip'=>$remote_ip,
                'session_id'=>session_id()
            );
            $this->start_micro_time=$start_time;
            $this->temp_id= ModelLit('log')->insert($insert);
        }
    }

    public  function  add_info($info=''){
         $this->info.=$info;
        return $this;//返回对象以便链式操作
    }
    //结束记录
    public  function  log_end($response=''){

        if($_GET['act']!='log'){
          // $content=ob_get_contents();
           $e = error_get_last();

            if($e['type']<8) {//如果小于8就值得注意了,发送提醒
                $error_msg = var_export($e, true);
                $info=sprintf('%s出错提醒,访问ip：%s, get参数：%s',c('meirong_name'), $_SERVER["REMOTE_ADDR"],substr(json_encode($_GET),0,200));
                write('['.date('Y-m-d H:i:s').']'.$info.chr(10).'[出错详情]'.chr(10).$error_msg,'error.log');
                Model('util')->send_wei_msg('lvcc',$info); //通过接口发送短信
                Model('util')->send_wei_msg('lvcc', '出错详情：' . $error_msg); //通过接口发送短信
                //详细信息 调用堆栈 暂时不输出
            }
            $response=$response?$response:'';
            if($this->temp_id){//如果存在则记录最终结果
                $end_time=microtime(true);

                $update=array(
                    'end_time'=>$end_time,
                    'diff_time'=>round(($end_time-$this->start_micro_time)*1000,2),//保留两位小时的精度
                    'response'=>substr($response,0,200),
                    'info'=>$this->info
                );

                ModelLit('log')->where(array('log_id'=>$this->temp_id))->update($update);
                if($update['diff_time']>2000){//大于2秒就是超时了
                    $name=c('meirong_name');
                    $ip=$_SERVER["REMOTE_ADDR"];
                    $get=json_encode($_GET);
                    Model('util')->send_wei_msg('lvcc',sprintf('%s超时提醒,访问ip：%s, get参数：%s',$name,$ip,$get)); //通过接口发送短信
                    Model('util')->send_wei_msg('lvcc','用时：'.$update['diff_time'].' 返回值：'.$response); //通过接口发送短信
                }
                //如果包含错误关键字也提醒
                if(!strstr($response,'<')){//说明不是html而是汉字返回
                    $name=c('meirong_name');
                    $ip=$_SERVER["REMOTE_ADDR"];
                    $get=json_encode($_GET);
                    if(strstr($response,'错误')){//通知我
                        Model('util')->send_wei_msg_async('lvcc',sprintf('%s返回错误信息,访问ip：%s, get参数：%s 返回值：%s ;log_id:%s',$name,$ip,$get,$response,$this->temp_id)); //通过接口发送短信
                    }
                    if(trim($response)){
                        //向上查找10次是否出现同样内容大于2次
                        $start=$this->temp_id-10;
                        $end=$this->temp_id;
                        $count= ModelLit('log')->where(array('log_id >'=>$start,'log_id <'=>$end))->where(array('response'=>$response))->count();
                        if($count>2&&!strstr($response,'成功')){ //重复返回提醒
                            Model('util')->send_wei_msg_async('lvcc',sprintf('%s 多次重复信息,访问ip：%s, get参数：%s 返回值：%s ;log_id:%s',$name,$ip,$get,$response,$this->temp_id)); //通过接口发送短信
                        }
                    }
                }

            }
        }
    }
    //死机注入日志；
    /*
1 E_ERROR 致命的运行错误。错误无法恢复，暂停执行脚本。
2 E_WARNING 运行时警告(非致命性错误)。非致命的运行错误，脚本执行不会停止。
4 E_PARSE 编译时解析错误。解析错误只由分析器产生。
8 E_NOTICE 运行时提醒(这些经常是你代码中的bug引起的，也可能是有意的行为造成的。)
16 E_CORE_ERROR PHP启动时初始化过程中的致命错误。
32 E_CORE_WARNING PHP启动时初始化过程中的警告(非致命性错)。
64 E_COMPILE_ERROR 编译时致命性错。这就像由Zend脚本引擎生成了一个E_ERROR。
128 E_COMPILE_WARNING 编译时警告(非致命性错)。这就像由Zend脚本引擎生成了一个E_WARNING警告。
256 E_USER_ERROR 用户自定义的错误消息。这就像由使用PHP函数trigger_error（程序员设置E_ERROR）
512 E_USER_WARNING 用户自定义的警告消息。这就像由使用PHP函数trigger_error（程序员设定的一个E_WARNING警告）
1024 E_USER_NOTICE 用户自定义的提醒消息。这就像一个由使用PHP函数trigger_error（程序员一个E_NOTICE集）
2048 E_STRICT 编码标准化警告。允许PHP建议如何修改代码以确保最佳的互操作性向前兼容性。
4096 E_RECOVERABLE_ERROR 开捕致命错误。这就像一个E_ERROR，但可以通过用户定义的处理捕获（又见set_error_handler（））
8191 E_ALL 所有的错误和警告(不包括 E_STRICT) (E_STRICT will be part of E_ALL as of PHP 6.0)
*/
    public  function  register_shutdown(){

        register_shutdown_function(function()
        {
          //出现异常错误记录到日志中
            $e = error_get_last();
            if($e['type']<8){//如果小于8就值得注意了
                $error_msg=var_export($e,true);
             //  $debug_trace= debug_backtrace();
              // $de_trace= json_encode($debug_trace);

                //出错提醒
                //
                $get=json_encode($_GET);//记录200长度单位
                $insert=array(
                    'log_get'=>$get,
                    'log_name'=>c('meirong_name'),
                    'start_time'=>time(),
                    'log_type'=>$e['type'],
                    'remote_ip'=>$_SERVER["REMOTE_ADDR"],
                    'response'=>$error_msg,
                    'add_time'=>date('Y-m-d H:i:s')
                );
                Model('util')->send_wei_msg('lvcc',sprintf('%s出错提醒,访问ip：%s, get参数：%s',$insert['log_name'],$insert['remote_ip'],$get)); //通过接口发送短信
                Model('util')->send_wei_msg('lvcc','出错详情：'.$error_msg); //通过接口发送短信
              //Model('util')->send_wei_msg('lvcc','堆栈：'.$de_trace); //通过接口发送短信

                ModelLit('log')->insert($insert);

        }

            // $detail=$GLOBALS['detail_info'];
            // $info=   file_get_contents('http://localhost:9092/mobile/index.php?a=b');
            // file_put_contents('a.log','ssdd');
            // file_put_contents('sync.txt',var_export($e,true),FILE_APPEND);
            // file_put_contents('sync.txt','source code:'.$detail,FILE_APPEND);
            //记录错误信息
         // echo '服务器繁忙，请稍后再试！';
        });
    }

}